package it.gat.dao.impl;

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import it.gat.dao.AppuntamentoDAO;
import it.gat.dao.ClienteDAO;
import it.gat.dao.SedeDAO;
import it.gat.model.Appuntamento;
import it.gat.util.dao.MySQLDAOFactory;

public class MySQLAppuntamentoDAOImpl implements AppuntamentoDAO {

	@Override
	public Appuntamento insert(Appuntamento appuntamento) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String strDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(appuntamento.getOrario());
		String query = "INSERT INTO Appuntamento " +
		               "(orario) " +
		               "VALUES " +
		               "('"+strDate+"')";
		stmt.executeUpdate(query);
		query = "SELECT LAST_INSERT_ID()";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			appuntamento.setIdAppuntamento(rs.getInt("LAST_INSERT_ID()"));
		}
		return appuntamento;
		
	}

	@Override
	public Appuntamento retriveById(int id) throws SQLException {
		Appuntamento appuntamento = new Appuntamento();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
		               "FROM Appuntamento " + 
		               "WHERE IdAppuntamento = " + id;
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			appuntamento.setIdAppuntamento(rs.getInt("idAppuntamento"));
			appuntamento.setOrario(rs.getTimestamp("orario"));
			}
		return appuntamento;
	}

	@Override
	public List<Appuntamento> retrieveAll() throws SQLException {
		List<Appuntamento> appuntamenti = new ArrayList<Appuntamento>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
		               "FROM Appuntamento "+
				       "ORDER BY orario";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			Appuntamento appuntamento = new Appuntamento();
			appuntamento.setIdAppuntamento(rs.getInt("idAppuntamento"));
			appuntamento.setOrario(rs.getTimestamp("orario"));
			appuntamenti.add(appuntamento);
			}
		return appuntamenti;
	}

	@Override
	public void update(Appuntamento appuntamento) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String strDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(appuntamento.getOrario());
		String query = "UPDATE Appuntamento " +
		               "SET orario = '"+strDate+"'" +
		               "WHERE IdAppuntamento = " + appuntamento.getIdAppuntamento();
		stmt.executeUpdate(query);
	}

	@Override
	public void delete(int idAppuntamento) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "DELETE FROM Appuntamento " +
		               "WHERE IdAppuntamento = " + idAppuntamento;
		stmt.executeUpdate(query);

	}

	@Override
	public List<Appuntamento> retrieveByNomeUtente(String nomeUtente) throws SQLException {
		List<Appuntamento> appuntamenti = new ArrayList<Appuntamento>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
				"FROM Ticket INNER JOIN Appuntamento ON Ticket.idAppuntamento=Appuntamento.idAppuntamento "+
				"INNER JOIN Cliente ON Ticket.idCliente=Cliente.idCliente LEFT JOIN Sede ON Ticket.idSede=Sede.idSede "+
				"WHERE idTecnico='"+nomeUtente+"' AND "+
				"ticket.stato='ASSEGNATO' "+
				"ORDER BY appuntamento.orario";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			Appuntamento appuntamento = new Appuntamento();
			appuntamento.setIdAppuntamento(rs.getInt("idAppuntamento"));
			appuntamento.setOrario(rs.getTimestamp("orario"));
			ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
			appuntamento.setCliente(clienteDAO.retriveById(rs.getInt("idcliente")));
			if (rs.getInt("idSede")!=0)
			{
				SedeDAO sedeDAO = new MySQLSedeDAOImpl();
				appuntamento.setSede(sedeDAO.retriveById(rs.getInt("idSede")));
			}
			appuntamenti.add(appuntamento);
		}
		return appuntamenti;
	}

}
